大整数加法和乘法STL

 

整型数一般是4个字节,但是有时候经常会遇到超大数的运算,系统就没办法了(现在通常的32位系统下)

因此必须自己解决,我们来定义一个大整数类来解决 MyBigNum

 

代码如下:

 

#include <iostream>
#include <string>
#include <deque>
#include <functional>
#include <algorithm>

using namespace std;

class MyBigNum
{
	deque<int> v;
public:
	MyBigNum() {}
	MyBigNum(string strNum)
	{
		copy(strNum.begin(),strNum.end(),back_inserter(v));
		transform(v.begin(),v.end(),v.begin(),bind2nd(minus<int>(),'0'));
	}

	deque<int>::iterator begin()
	{
		return v.begin();
	}

	deque<int>::iterator end()
	{
		return v.end();
	}

	int size()
	{
		return v.size();
	}

	back_insert_iterator<deque<int> >Back_Inserter()
	{
		return back_inserter(v);
	}

	void push_front(int n)
	{
		v.push_front(n);
	}

	void push_back(int n)
	{
		v.push_back(n);
	}

	void adjust()
	{
		int nSize = v.size();

		for(int i = nSize-1;i >= 1; i --)
		{
			int value = v[i];
			if(value < 10)
				continue;
			v[i] = value%10;
			v[i-1] += value/10;
		}

		int value = v[0];
		if(value >= 10)
		{
			v[0] = value%10;
			value = value / 10;
			while(value > 0)
			{
				v.push_front(value%10);
				value /= 10;
			}
		}
		nSize = v.size();
	}

	MyBigNum Add(MyBigNum & m)
	{
		MyBigNum result;
		int n = size() - m.size();
		if(n >= 0)
		{
			transform(begin()+n,end(),m.begin(),result.Back_Inserter(),plus<int>());
			for(int i = n - 1; i >= 0 ;i --)
			{
				result.push_front(* (begin()+i));
			}
		}
		else
		{    //代码和上面一段一样很容易理解,只要注意n为负,转换过来和上面一样
			transform(begin(),end(),m.begin()-n,result.Back_Inserter(),plus<int>());
			for(int i = -n-1; i >= 0 ; i --)
			{
				result.push_front(*(m.begin()+i));
			}
		}

		result.adjust();

		return result;
	}

	MyBigNum  Multiply(MyBigNum &m)
	{
		MyBigNum result("0");
		MyBigNum mid;

		for(int i = m.size()-1 ;i >= 0; i --)
		{
			mid = *this;
			for(int j = 0 ; j < i ;j ++)
			{
				mid.push_back(0);
			}
			transform(mid.begin(),mid.end(),mid.begin(),bind2nd(multiplies<int>(),*(m.begin()+i)));
			result = mid.Add(result);  //Add函数内已经调用了调整函数
		}
		return result;
	}
};


int main()
{
	MyBigNum m1("1234567890");
	MyBigNum m2("99999999998");
	MyBigNum result = m1.Add(m2);
	cout << "1234567890 + 99999999998 = ";
	copy(result.begin(),result.end(),ostream_iterator<int>(cout));
	cout << endl;

	MyBigNum m3("99");
	MyBigNum m4("99999");
	MyBigNum m5 = m3.Multiply(m4);
	cout << "99 * 99999 = ";
	copy(m5.begin(),m5.end(),ostream_iterator<int>(cout));
	cout << endl;

	return 0;
}


 

三大算法:

 

adjust算法:

 

01> 获得待调整大整型数容器长度nSize

02> for  从最低位开始到次高位,循环依次调整每一位

03>               若当前位小于10,转到2

04>               当前位值等于当前值对10取余

05>               利用while循环把进位值依次加到前面位的值当中

06> end  for

07> if     最高位值大于10

08>               最高位值等于当前值对10取余

09>               改变容器大小,利用while循环把进位值依次填充新加位的值

10> endif

 

 

Add算法:

 

01> 定义结果大整型数变量result

02> 求被加数位数与加数位数差n

03> if  n >= 0  then

04>                 从最高位开始加数所有位与被加数所有位相加,每位结果和存入result后面

05>                 把被加数多余位存入result前面

06> else

07>                 从高位开始被加数所有位与加数所有位相应位相加,每位结果存入result后面

08>                 把加数多余位存入result前面

09> endif

10> result  <- result.adjust() ,进行位数值调整,保证result容器每位值都小于10

11> 返回result 给调用者

 

 

Multiply算法:

 

01> 定义结果大整型数result,初始值为0,用于累加

02> 定义临时大整型数变量mid

03> for i=0,i < 乘数位数 , i ++

04>             mid <- 被乘数大整型数

05>             mid 尾部添加适当个数0元素

06>             mid 中每位值等于mid中每位当前值乘以乘数从低位开始的第 i 位

07>             result <- mid.Add(result)

08> end for

09> 返回result给调用者

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用STL实现的包含加法乘法的多项式程序: ``` // 声明多项式的结构体 TYPE polynomial : STRUCT coefficient : REAL; // 系数 exponent : INT; // 指数 END_STRUCT END_TYPE // 声明加法函数 FUNCTION AddPolynomials : ARRAY[1..10] OF polynomial : VAR_INPUT poly1 : ARRAY[1..10] OF polynomial; // 多项式1 poly2 : ARRAY[1..10] OF polynomial; // 多项式2 END_VAR VAR_OUTPUT result : ARRAY[1..10] OF polynomial; // 结果多项式 END_VAR VAR i : INT; END_VAR FOR i := 1 TO 10 DO // 系数相加 result[i].coefficient := poly1[i].coefficient + poly2[i].coefficient; // 指数不变 result[i].exponent := poly1[i].exponent; END_FOR END_FUNCTION // 声明乘法函数 FUNCTION MultiplyPolynomials : ARRAY[1..100] OF polynomial : VAR_INPUT poly1 : ARRAY[1..10] OF polynomial; // 多项式1 poly2 : ARRAY[1..10] OF polynomial; // 多项式2 END_VAR VAR_OUTPUT result : ARRAY[1..100] OF polynomial; // 结果多项式 END_VAR VAR i, j, k : INT; temp : polynomial; END_VAR // 清空结果多项式 FOR i := 1 TO 100 DO result[i].coefficient := 0; result[i].exponent := 0; END_FOR // 乘法运算 FOR i := 1 TO 10 DO FOR j := 1 TO 10 DO k := poly1[i].exponent + poly2[j].exponent; temp.coefficient := poly1[i].coefficient * poly2[j].coefficient; temp.exponent := k; // 累加同类项 result[k].coefficient := result[k].coefficient + temp.coefficient; END_FOR END_FOR END_FUNCTION ``` 上述程序定义了一个多项式结构体`polynomial`,包含系数和指数两个成员变量。同时,定义了一个加法函数`AddPolynomials`和一个乘法函数`MultiplyPolynomials`,分别实现多项式相加和相乘的功能。 在加法函数中,通过循环遍历两个多项式的每一项,将系数相加得到结果多项式。在乘法函数中,同样通过循环遍历两个多项式的每一项,计算出乘积的系数和指数,并将同类项累加到结果多项式中。 注意,在实际应用中,需要根据实际情况进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值